#ifndef __HEAPQ_H__
#define __HEAPQ_H__

#include "vector.h"

#include <stddef.h>
#include <stdbool.h>


// 比较函数类型定义
// a > b, return 1; a == b, return 0; a < b, return -1.
typedef int (*heapq_compare_fn)(const void *a, const void *b);

// heapq 结构体定义
typedef struct {
    vector vec;
    heapq_compare_fn cmp;    // 比较函数
} heapq;

// 初始化 heapq
void heapq_init(heapq *h, size_t element_size, heapq_compare_fn cmp, vector_cons_fn cons_fn, vector_free_fn free_fn, vector_copy_fn copy_fn);

// 释放 heapq
void heapq_free(heapq *h);

// 返回 heapq 的大小
int heapq_size(const heapq *h);

// 返回 heapq 是否为空
bool heapq_empty(const heapq *h);

// 向 heapq 中添加一个元素
void heapq_push(heapq *h, const void *element);

// 从 heapq 中返回顶部元素
void *heapq_top(heapq *h);

// 从 heapq 中移除顶部元素
void heapq_pop(heapq *h);

// 清空 heapq
void heapq_clear(heapq *h);

#endif // HEAPQ_H